package licode.unisop.oidc.auth.api;

import licode.unisop.oidc.auth.modal.AccessTokenId;
import licode.unisop.oidc.auth.modal.OidcToken;
import licode.unisop.oidc.auth.modal.SessionDetail;

/**
 * 定义用户登录的会话接口
 * authorize：授权
 * authenticate：认证
 *
 * @author licode
 */
public interface OidcSession {
    /**
     * 获取用户ID
     *
     * @return 用户ID
     */
    String getUserId();

    /**
     * 获取会话ID
     *
     * @return 会话ID
     */
    String getSessionId();

    /**
     * 获取会话的令牌
     * @return 会话令牌
     */
    String getSessionToken();

    /**
     * 获取单点登录记录条数
     * @return 单点登录条数
     */
    int getSsoLoginCount();

    /**
     * 获取指定平台指定终端登录数
     * @return 登录数
     */
    int getTerminalLoginCount(String platformId, String terminalId);

    /**
     * 把指定终端用户踢下线
     * @param platformId 平台标识
     * @param terminalId 终端标识
     */
    void tickOffTerminalLogin(String platformId, String terminalId);

    /**
     * 获取会话创建时间
     *
     * @return 创建时间
     */
    long getCreateTime();

    /**
     * 获取此Session的剩余存活时间 (单位: 秒)
     *
     * @return 此Session的剩余存活时间 (单位: 秒)
     */
    Long getExpiredTime();

    /**
     * 根据访问令牌获取对应的登录信息
     * @param accessToken 访问令牌
     * @return 登录信息
     */
    OidcToken getTokenInfo(AccessTokenId accessToken);

    /**
     * 获取第一个SSO登录的用户信息
     * @return 登录信息
     */
    OidcToken getFirstSsoTokenInfo(String ssoToken);

    /**
     * 更新会话的超时时间，此方法会自动保存会话信息
     *
     * @param expiredTime 会话超时时间
     */
    void updateExpiredTime(long expiredTime, boolean updateSso);

    /**
     * 获取会话属性
     * @param key 属性名称
     * @return 属性值
     */
    Object getAttribute(String key);

    /**
     * 在会话上设置属性信息
     *
     * @param key 属性名称
     * @param value 属性值
     */
    void setAttribute(String key, Object value);

    /**
     * 获取会话登录的所有信息
     *
     * @return 会话登录信息
     */
    SessionDetail getLoginInfo();

    /**
     * 更新会话信息（会话属性改变后需要更新）
     */
    void updateSession();

    /**
     * 退出会话，包括普通登录和单点登录
     */
    void exitSession();

    /**
     * 退出单点登录的会话
     */
    void exitSsoSession();
}
